package cn.rslee.demo.spring.mybatis.service;

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.apache.cxf.jaxrs.ext.PATCH;

import cn.rslee.demo.spring.mybatis.entity.AccessLog;
import cn.rslee.demo.spring.mybatis.entity.AccessLogCount;
import cn.rslee.demo.spring.mybatis.entity.DateParam;
import cn.rslee.server.IPage;

/**
 * 描述：
 * 
 * <pre>
 * HISTORY
 * ****************************************************************************
 *  ID   DATE           PERSON          REASON
 *  1    2016年2月26日      rslee         Create
 * ****************************************************************************
 * </pre>
 * 
 * 基于xml实现accesslog的CRUD
 * 
 * rest api 参考如下
 * 
 * GET /zoos：列出所有动物园
 * POST /zoos：新建一个动物园
 * GET /zoos/ID：获取某个指定动物园的信息
 * PUT /zoos/ID：更新某个指定动物园的信息（提供该动物园的全部信息）
 * PATCH /zoos/ID：更新某个指定动物园的信息（提供该动物园的部分信息）
 * DELETE /zoos/ID：删除某个动物园
 * 
 * 返回信息参考：
 * GET /collection：返回资源对象的列表（数组）
 * GET /collection/resource：返回单个资源对象
 * POST /collection：返回新生成的资源对象
 * PUT /collection/resource：返回完整的资源对象
 * PATCH /collection/resource：返回完整的资源对象
 * DELETE /collection/resource：返回一个空文档
 * 
 * @author rslee
 * @since 1.0
 */
public interface XmlAccessLogService {
	
	/**
	 * 新增
	 * @param log
	 * @return
	 * AccessLog
	 */
	@POST
	@Path("/xmlaccesslog")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public AccessLog create(AccessLog log);
	
	@POST
	@Path("/xmlaccesslog/name")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public AccessLog createByName(AccessLog log);
	
	/**
	 * 更新(全部)
	 * @param log
	 * @return
	 * AccessLog
	 */
	@PUT
	@Path("/xmlaccesslog/{id}")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public AccessLog update(@PathParam("id") long id,AccessLog log);
	
	/**
	 * 更新(部分)
	 * @param log
	 * @return
	 * AccessLog
	 */
	@PATCH
	@Path("/xmlaccesslog/{id}")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public AccessLog patchUpdate(@PathParam("id") long id,AccessLog log);
	
	
	/**
	 * 读取所有
	 * @return
	 * List<AccessLog>
	 */
	@GET
    @Path("/xmlaccesslogs")
    @Produces(MediaType.APPLICATION_JSON)
    List<AccessLog> findAll();
	
	/**
	 * 分页读取,访问格式为：/xmlaccesslogs/page?page=1&size=10
	 * @return
	 * List<AccessLog>
	 */
	@GET
    @Path("/xmlaccesslogs/page")
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
	IPage<AccessLog> findByPage(@FormParam("page") int page,@FormParam("size") int size);

    /**
     * 读取某个
     * @param id
     * @return
     * AccessLog
     */
    @GET
    @Path("/xmlaccesslog/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    AccessLog get(@PathParam("id") long id);
    
    /**
     * 删除
     * @param id
     * @return
     * AccessLog
     */
    @DELETE
    @Path("/xmlaccesslog/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    AccessLog delete(@PathParam("id") long id);
    
    @GET
    @Path("/xmlaccesslog/{username}/{sysCode}")
    @Produces(MediaType.APPLICATION_JSON)
    public List<AccessLog> findByUsernameAndSysCode(@PathParam("username") String username
    		,@PathParam("sysCode") String sysCode);
    
    @GET
    @Path("/xmlaccesslog/order-by/{username}")
    @Produces(MediaType.APPLICATION_JSON)
    public List<AccessLog> findByUsernameAndOrder(@PathParam("username") String username
    		,@FormParam("orderBy") String orderBy);
    
    @GET
    @Path("/xmlaccesslog/group-by/{groupBy}")
    @Produces(MediaType.APPLICATION_JSON)
    public List<AccessLogCount> groupBy(@PathParam("groupBy") String groupBy);
    
    @GET
    @Path("/xmlaccesslogs/params")
    @Produces(MediaType.APPLICATION_JSON)
    public List<AccessLog> findByParams(@FormParam("sysCode") String sysCode,
    		@FormParam("username") String username
    		,@FormParam("visitTm") DateParam visitTm);
    
    @GET
    @Path("/xmlaccesslogs/queryparams")
    @Produces(MediaType.APPLICATION_JSON)
    public List<AccessLog> findByQueryParams(@FormParam("sysCode") String sysCode,
    		@FormParam("username") String username
    		,@FormParam("visitTm") DateParam visitTm);

}
